﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace Common
{
	public class SecurityHelper
	{

		private static string KEY = ConfigSetting.Instance["3DES_KEY"];
		private static string IV = ConfigSetting.Instance["3DES_IV"];

		/// <summary>
		/// 3DES加密
		/// </summary>
		/// <param name="strText"></param>
		/// <param name="key"></param>
		/// <param name="iv"></param>
		/// <returns></returns>
		public static String DESDecrypt(String strText, string key, string iv)
		{
			System.Security.Cryptography.TripleDESCryptoServiceProvider des3 = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
			des3.Key = Convert.FromBase64String(key);
			des3.IV = Convert.FromBase64String(iv);

			string result = string.Empty;
			try
			{
				byte[] buffer = Convert.FromBase64String(strText);
				buffer = des3.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length);
				result = System.Text.Encoding.UTF8.GetString(buffer);
			}
			catch
			{
				throw;
			}
			return result;
		}

		/// <summary>
		/// 3DES加密
		/// </summary>
		/// <param name="strText">待加密文字</param>
		/// <param name="key">KEY</param>
		/// <param name="iv">向量</param>
		/// <returns></returns>
		public static string DESEncrypt(string strText, string key, string iv)
		{
			System.Security.Cryptography.TripleDESCryptoServiceProvider des3 = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
			des3.Key = Convert.FromBase64String(key);
			des3.IV = Convert.FromBase64String(iv);

			string result = string.Empty;
			try
			{
				byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strText);
				buffer = des3.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length);
				result = Convert.ToBase64String(buffer);
			}
			catch
			{
				throw;
			}
			return result;
		}
		/// <summary>
		/// DES加密
		/// </summary>
		/// <param name="source"></param>
		/// <returns></returns>
		public static string DESEncrypt(string source)
		{
			return DESEncrypt(source, KEY ,IV);
		}
		/// <summary>
		/// DES解密
		/// </summary>
		/// <param name="source"></param>
		/// <returns></returns>
		public static string DESDecrypt(string source)
		{
			return DESDecrypt(source, KEY, IV);
		}



		/// <summary>
		/// MD5加密
		/// </summary>
		/// <param name="s"></param>
		/// <returns></returns>
		public static string MD5Encrypt(string s)
		{
			string strResult = "";
			System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
			byte[] bytResult = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(s));
			for (int i = 0; i < bytResult.Length; i++)
			{
				strResult = strResult + bytResult[i].ToString("x");
			}
			return strResult;
		}

		/// <summary>
		/// 与PHP兼容的MD5加密
		/// </summary>
		/// <param name="password"></param>
		/// <returns></returns>
		public static string MD5(string password)
		{
		
			byte[] textBytes = System.Text.Encoding.UTF8.GetBytes(password);
			try
			{
				System.Security.Cryptography.MD5CryptoServiceProvider cryptHandler;
				cryptHandler = new System.Security.Cryptography.MD5CryptoServiceProvider();
				byte[] hash = cryptHandler.ComputeHash(textBytes);
				string ret = "";
				foreach (byte a in hash)
				{
					if (a < 16)
						ret += "0" + a.ToString("x");
					else
						ret += a.ToString("x");
				}
				return ret;
			}
			catch
			{
				throw;
			}

		} 

 
		
		

	}
}
